perm filename STACK.SAI[PNT,HE] blob sn#492433 filedate 1980-01-21 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	ENTRY
C00010 ENDMK
C⊗;
ENTRY;
BEGIN
INTERNAL RECORD_CLASS ISTACK(INTEGER ARRAY STACK;INTEGER TOP,LIMIT);
INTERNAL RECORD_CLASS FSTACK(REAL ARRAY STACK; INTEGER TOP,LIMIT);
INTERNAL RECORD_CLASS RSTACK(RECORD_POINTER(ANY_CLASS) ARRAY STACK; INTEGER TOP,LIMIT);
DEFINE RPTR="RECORD_POINTER";
COMMENT range of stack is 1 to LIMIT, and the first element in the stack is at 1.
	TOP represents the current top, and LIMIT the maximum;

DEFINE NEW_STACK(STACKTYPE,ELEMENTTYPE) "[][]" =
	[ BEGIN
	RPTR(STACKTYPE) PTR;
	ELEMENTTYPE ARRAY ARR[1:SIZE];
	PTR←NEW_RECORD(STACKTYPE);
	STACKTYPE:LIMIT[PTR]←SIZE;
	STACKTYPE:TOP[PTR]←0;
	MEMORY[LOCATION(STACKTYPE:STACK[PTR])]↔MEMORY[LOCATION(ARR)];
	RETURN(PTR);
	END;];

DEFINE POP(STACKTYPE,DEF)"[][]"=[
	BEGIN  INTEGER TOP;
	IF (TOP←STACKTYPE:TOP[PTR])=0
		THEN BEGIN
			PRINT("UNDERFLOW IN STACKTYPE STACK: RETURNING DEFAULT");
			RETURN(DEF);
		     END;
	STACKTYPE:TOP[PTR]←TOP -1;
	RETURN(STACKTYPE:STACK[PTR][TOP]);
	END];

DEFINE PUSH(STACKTYPE,ELEMENT,ELEMENTTYPE)"[][]"=[
	BEGIN
	INTEGER TOP,NLIMIT;
	IF (TOP←STACKTYPE:TOP[PTR])=STACKTYPE:LIMIT[PTR]
		THEN BEGIN "increase size of stack"
			ELEMENTTYPE ARRAY ARR[1:NLIMIT←TOP*1.25+10];
			ARRTRAN(ARR,STACKTYPE:STACK[PTR]);
			STACKTYPE:LIMIT[PTR]←NLIMIT;
			MEMORY[LOCATION(STACKTYPE:STACK[PTR])]↔MEMORY[LOCATION(ARR)];
		    END;
	STACKTYPE:TOP[PTR]←(TOP←TOP+1);
	STACKTYPE:STACK[PTR][TOP]←ELEMENT;
	END];

DEFINE TRIM(STACKTYPE,ELEMENTTYPE)"[][]"=[
	BEGIN
	INTEGER TOP;
	ELEMENTTYPE ARRAY ARR[1:TOP←STACKTYPE:TOP[PTR]];
	ARRBLT(ARR[1],STACKTYPE:STACK[PTR][1],TOP);
	MEMORY[LOCATION(STACKTYPE:STACK[PTR])]↔MEMORY[LOCATION(ARR)];
	STACKTYPE:LIMIT[PTR]←TOP;
	END;];

DEFINE JOIN(P1,P2,ELEMENTYPE,NEWSTACKROUTINE,STACKTYPE)"[][]"=[
	BEGIN
	RPTR(STACKTYPE)P3;
	INTEGER TOP1,TOP2,TOP3,LIMIT;
	TOP1←STACKTYPE:TOP[P1];
	TOP2←STACKTYPE:TOP[P2];
	P3←NEWSTACKROUTINE(TOP3←(TOP1+TOP2)*1.25+10);
	ARRBLT(STACKTYPE:STACK[P3][1],STACKTYPE:STACK[P1][1],TOP1);
	ARRBLT(STACKTYPE:STACK[P3][TOP1+1],STACKTYPE:STACK[P2][1],TOP2);
	STACKTYPE:TOP[P3]←TOP1+TOP2;
	RETURN(P3);
	END;];

DEFINE ATTACH(P1,P2,ELEMENTYPE,STACKTYPE)"[][]"=[
	BEGIN
	RPTR(STACKTYPE)P3;
	INTEGER TOP1,TOP2,TOP3,LIMIT;
	TOP1←STACKTYPE:TOP[P1];
	TOP2←STACKTYPE:TOP[P2];
	TOP3←TOP1+TOP2;
	IF STACKTYPE:LIMIT[P1]<TOP3
		THEN BEGIN
			ELEMENTYPE ARRAY ARR[1:STACKTYPE:LIMIT[P1]←TOP3*1.25+10];
			ARRBLT(ARR[1],STACKTYPE:STACK[P1][1],TOP1);
			MEMORY[LOCATION(ARR)]↔MEMORY[LOCATION(STACKTYPE:STACK[P1])];
		     END;
	ARRBLT(STACKTYPE:STACK[P3][TOP1+1],STACKTYPE:STACK[P2][1],TOP2);
	STACKTYPE:TOP[P1]←TOP3;
	END;];

REQUIRE "[][]" DELIMITERS;
INTERNAL RPTR(ISTACK)PROCEDURE NEW_ISTACK(INTEGER SIZE(10));
	NEW_STACK(ISTACK,INTEGER);
INTERNAL RPTR(FSTACK)PROCEDURE NEW_FSTACK(INTEGER SIZE(10));
	NEW_STACK(FSTACK,REAL);
INTERNAL RPTR(RSTACK)PROCEDURE NEW_RSTACK(INTEGER SIZE(10));
	NEW_STACK(RSTACK,[RECORD_POINTER(ANY_CLASS)]);

INTERNAL INTEGER PROCEDURE IPOP(RPTR(ISTACK)PTR);
	POP(ISTACK,0);
INTERNAL REAL PROCEDURE FPOP(RPTR(FSTACK)PTR);
	POP(FSTACK,0.0);
INTERNAL RPTR(ANY_CLASS) PROCEDURE RPOP(RPTR(RSTACK)PTR);
	POP(RSTACK,NULL_RECORD);

INTERNAL PROCEDURE ISPUSH(RPTR(ISTACK)PTR; INTEGER ELEMENT);
	PUSH(ISTACK,ELEMENT,INTEGER);
INTERNAL PROCEDURE FSPUSH(RPTR(FSTACK)PTR; REAL ELEMENT);
	PUSH(FSTACK,ELEMENT,REAL);
INTERNAL PROCEDURE RPUSH(RPTR(RSTACK)PTR; RPTR(ANY_CLASS)ELEMENT);
	PUSH(RSTACK,ELEMENT,[RPTR(ANY_CLASS)]);

INTERNAL RPTR(ISTACK)PROCEDURE IJOIN(RPTR(ISTACK)P1,P2);
	JOIN(P1,P2,INTEGER,NEW_ISTACK,ISTACK);
INTERNAL RPTR(FSTACK)PROCEDURE FJOIN(RPTR(FSTACK)P1,P2);
	JOIN(P1,P2,REAL,NEW_FSTACK,FSTACK);
INTERNAL RPTR(RSTACK)PROCEDURE RJOIN(RPTR(RSTACK)P1,P2);
	JOIN(P1,P2,[RPTR(ANY_CLASS)],NEW_RSTACK,RSTACK);

INTERNAL PROCEDURE IATTACH(RPTR(ISTACK)P1,P2);
	ATTACH(P1,P2,INTEGER,ISTACK);
INTERNAL PROCEDURE FATTACH(RPTR(FSTACK)P1,P2);
	ATTACH(P1,P2,REAL,FSTACK);
INTERNAL PROCEDURE RATTACH(RPTR(RSTACK)P1,P2);
	ATTACH(P1,P2,[RPTR(ANY_CLASS)],RSTACK);

INTERNAL PROCEDURE ITRIM(RPTR(ISTACK)PTR);
	TRIM(ISTACK,INTEGER);
INTERNAL PROCEDURE FTRIM(RPTR(FSTACK)PTR);
	TRIM(FSTACK,REAL);
INTERNAL PROCEDURE RTRIM(RPTR(RSTACK)PTR);
	TRIM(RSTACK,[RPTR(ANY_CLASS)]);

INTERNAL PROCEDURE ZERO_ISTACK(RPTR(ISTACK)PTR);
	ISTACK:TOP[PTR]←0;
INTERNAL PROCEDURE ZERO_FSTACK(RPTR(FSTACK)PTR);
	FSTACK:TOP[PTR]←0;
INTERNAL PROCEDURE ZERO_RSTACK(RPTR(RSTACK)PTR);
	RSTACK:TOP[PTR]←0;
	
END;